package com.gxa.xc.rbac.service.impl;

import com.gxa.xc.rbac.dto.ResultDTO;
import com.gxa.xc.rbac.mapper.PermisssionMapper;
import com.gxa.xc.rbac.pojo.Admin;
import com.gxa.xc.rbac.pojo.Menu;
import com.gxa.xc.rbac.pojo.Permission;
import com.gxa.xc.rbac.pojo.Role;
import com.gxa.xc.rbac.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

/**
 * @author:IT-CNLM
 * @date:Created at 2020/10/26
 */
@Service
@SuppressWarnings("all")
public class MenuServiceImpl implements MenuService {


    @Autowired
    private PermisssionMapper permisssionMapper;

    /**
     * 获取菜单列表
     * @param session
     * @return
     */
    @Override
    public ResultDTO menuList(HttpSession session) {
        // 先从session中获取管理员对象
        Admin admin = (Admin) session.getAttribute("admin");
        // 所有权限的容器
        List<Permission> permissionList = new ArrayList<>();
        // 判断是否是超级管理员
        if (isSuper(admin)) {
            // 超级管理员的权限 应该是数据库中 所有的权限
            permissionList = permisssionMapper.findAll();

        }else{
            // 非超级管理员
            // 将所有的权限数据获取
            for (Role role: admin.getRoles()) {
                permissionList.addAll(role.getPermissions());
            }
        }

        // 组装的菜单
        List<Menu> menus = new ArrayList<>();
        // 遍历 生成 一级菜单
        for (Permission permission : permissionList) {
            if(permission.getIsMenu().equals(1) && permission.getPermissionLevel().equals(1)){
                // 构造出一级菜单
                Menu menu = new Menu(permission.getId(), permission.getParentId(), permission.getPermissionName(), permission.getPermissionUrl());
                menus.add(menu);
            }
        }

        // 遍历添加二级菜单
        for (Menu menu : menus) {
            for (Permission permission : permissionList) {
                if(permission.getIsMenu().equals(1) && permission.getPermissionLevel().equals(2) && permission.getParentId().equals(menu.getMenuId())){
                    // 当前的子级菜单
                    Menu childMenu = new Menu(permission.getId(), permission.getParentId(), permission.getPermissionName(), permission.getPermissionUrl());
                    menu.getSubMenus().add(childMenu);
                }
            }
        }

        return new ResultDTO(200, "success", menus);
    }

    /**
     * 判断是否是超级管理员
     * @param admin
     * @return
     */
    private Boolean isSuper(Admin admin) {
        for (Role role : admin.getRoles()) {
            // 4 是超级管理员
            if(role.getId().equals(4)){
                return true;
            }
        }
        return false;
    }
}
